package com.example.wechatappbackend.controller.front;

import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;

import javax.websocket.*;
import javax.websocket.server.PathParam;
import javax.websocket.server.ServerEndpoint;
import java.io.IOException;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;

@ServerEndpoint("/websocket/{userid}")
@Component
@Slf4j
public class PmWebSocket {
    //保存在线用户id以及对应客户端
    public static Map<String, PmWebSocket> onlineUsers = new ConcurrentHashMap<>();
    /**
     * 用来给客户端发送消息
     */
    private Session session;
    /**
     * 连接建立成功调用的方法
     */
    @OnOpen
    public void onOpen(Session session,@PathParam("userid") String userid) {
        this.session=session;
        log.info(userid+"连接成功");       //将用户id和socket对象保存
        onlineUsers.put(userid,this);
    }

    /**
     * 连接关闭调用的方法
     */
    @OnClose
    public void onClose() {
        System.out.println("有一连接关闭");
    }

    /**
     * 收到客户端消息后调用的方法
     *
     * @param message 客户端发送过来的消息
     */
    @OnMessage
    public void onMessage(String message, Session session) {
        System.out.println("来自客户端的消息:" + message);
    }    /**     *发送消息方法     */
    private void broadcastMsgToAllOnlineUsers(String message) {
        //根据用户id获取socket对象 这里userid就是上面连接时候的用户id 具体怎么传过来怎么操作 思路很多 你们自己想个思路                //如果是聊天室的话 就要把这个消息发送给所有在线用户 那么就遍历onlineUsers数组就好了 每个人都发送一次
        PmWebSocket webSocket = onlineUsers.get("userid");
        //获取推送对象
        RemoteEndpoint.Basic basicRemote = webSocket.session.getBasicRemote();
        try {
            //发送消息
            basicRemote.sendText(message);
        } catch (IOException e) {
            log.error("广播发送系统消息失败！{}", e);
            e.printStackTrace();
        }
    }


    /**
     * 发生错误时调用
     */
    @OnError
    public void onError(Session session, Throwable error) {
        System.out.println("发生错误");
        error.printStackTrace();
    }
}



